import { _decorator, Component, director, Label, Node } from 'cc';
const { ccclass, property } = _decorator;
import { game } from './game';
// import { systemFunction } from './systemFunction';
// import { getRank } from './getRank';
// import { getHistory } from './getHistory';
// 声明 JsBridge 类型，避免 TS 报错
declare global {
    interface Window {
        JsBridge?: {
            quit: () => void;
            recharge: ()=> void;
        }
    }
    interface Window {
        updateWallet: (amount: number) => void;
    }
}

@ccclass('WebsocketTs')
export class WebsocketTs extends Component {
    private ws: WebSocket | null = null;

    // WebsocketTs服务器地址
    @property({ tooltip: 'WebSocket服务器地址' })
    url: string = 'wss://test-game.yayuengine.com/car/ws?appId=1451729&userId=12345&token=12345:d3f1e9106cebedcdfce3a241abac9423';
    // url: string = 'ws://localhost:8080';
    // url: string = 'wss://test-game.yayuengine.com/greedy/ws';
    // url: string = 'wss://echo.WebSocket.org';
    
    // 获取游戏脚本节点
    @property({type:Node})
    private gameNode:Node = null;
    // 获取系统功能脚本节点
    @property({type:Node})
    private systemFunction:Node = null;
    // 获取排行榜脚本节点
    @property({type:Node})
    private ranking:Node = null;
    // 获取历史记录脚本节点
    @property({type:Node})
    private history:Node = null;

    // 提示弹窗节点
    @property(Node)
    private TipNode:Node = null;

    // 引入 pako 库
    private pako: any = null;

    // 定义一个重连定时器，如果重连成功则关闭定时器不需要再次开启WiFi连接界面
    private reconnectTimer = null
    private isFocus = true
    // 定义网络延迟定时器
    private wifiTimer = null
    onLoad(){
        this.connect();
        // 暴露全局方法供App调用
        window.updateWallet = this.updateWallet.bind(this);
        
    }
    update(){
        // this.checkFocus()
    }
    start() {
        // console.log(this.gameNode.getComponent(game).test('kkk'))
    }

 
    // 连接Websocket
    connect() {
        if (this.ws) {
            this.ws.close();
        }

        // 创建 URLSearchParams 对象解析 URL 参数
        const urlParams = new URLSearchParams(window.location.search);
        // 从url上获取appId,userId,token等信息
        const appId = urlParams.get('appId') || '1451729';
        const userId = urlParams.get('userId') || '12345';
        const token = urlParams.get('token') || '12345:d3f1e9106cebedcdfce3a241abac9423';
        // console.log(urlParams,"urlParams")
        // https://test-game.yayuengine.com/car/
        // https://test-game.yayuengine.com/car/?appId=1451729&userId=12345&token=12345:d3f1e9106cebedcdfce3a241abac9423&locale=ar-AR
        // http://localhost:7456/?appId=1451729&userId=12345&token=12345:d3f1e9106cebedcdfce3a241abac9423&locale=ar-AR
        // http://localhost:7456/?appId=1451729&userId=12345&token=12345:d3f1e9106cebedcdfce3a241abac9423&locale=en
        // http://localhost:7456/?userId=23456&token=23456:629d2ceca3597b8212f413bb809826d5
        // 拼接Websocket地址
        const wsUrl = `wss://test-game.yayuengine.com/tp/ws?appId=${appId}&userId=${userId}&token=${token}`;
        // const wsUrl = 'wss://test-game.yayuengine.com/dt/ws' + window.location.search;
        this.ws = new WebSocket(wsUrl);

        this.ws.onopen = (event) => {
            console.log('Websocket连接成功');
            // 连接成功则关闭重连定时器
            clearTimeout(this.reconnectTimer)
            // 连接成功后设置定时器定时获取网络延迟
            this.wifiTimer = setInterval(()=>{
                // 获取当前时间戳（毫秒）
                let timestamp = new Date().getTime();
                // 客户端向服务器发送信息
                const obj = {
                    "t": 105,
                    "d": {
                      "ts": timestamp //Web端发送消息时的当前毫秒时间戳
                    }
                }
                // console.log(timestamp)
                this.ws.send(JSON.stringify(obj));
                
            },1000)

            // 连接成功则隐藏wifi连接动画
            // this.gameNode.getComponent(game).stopLoadAni()
        };

        this.ws.onmessage = (event) => {
            let AllData = event.data
            // 将event.data从字符串形式转化回JSON格式方便读取数据
            // const AllData = JSON.parse(event.data)
            if(AllData instanceof Blob){
                const blob = event.data as Blob;
                const fileReader = new FileReader();
                fileReader.onload = (e) => {
                    // 2. 读取完成后，e.target.result 就是 ArrayBuffer
                    const arrayBuffer = e.target.result as ArrayBuffer;
                    // 3. 用 pako 解压
                    const uint8Arr = new Uint8Array(arrayBuffer);
                    const str = window['pako'].ungzip(uint8Arr, { to: 'string' });
                    // 4. 如果是 JSON 字符串，转为对象
                    const data = JSON.parse(str);
                    console.log('解压后的数据', data);
                    if(data.t == 1){//刚进入游戏
                        // // 更新结算面板数据
                        // this.gameNode.getComponent(game).getEndResult(data.d.game.status,data.d.game.roundNum,data.d.myResult.income,data.d.myResult.cost,data.d.game.result)
                        // // 获取游戏状态，以及该状态剩余时间
                        this.gameNode.getComponent(game).getBetTime(data.d.game.ms,data.d.game.status,data.d.game.result,data.d.myResult.income)
                        // // 更新基本信息
                        // this.gameNode.getComponent(game).getBaseMessage(data.d.game.allBet,data.d.myBet,data.d.goldList,data.d.balance,data.d.game.status)
                        // // 更新开奖记录
                        // this.gameNode.getComponent(game).updateRecord(data.d.resultList)
                        // // 改变筹码价值
                        // this.gameNode.getComponent(game).changeValue(data.t,data.d.goldList[0],data.d.goldList[1],data.d.goldList[2],data.d.goldList[3])
                        // // 更新Top1玩家信息
                        // this.gameNode.getComponent(game).getTopMessage(data.d.winnerList,data.t == 1)
                        // // 更新结算界面用户信息
                        // this.gameNode.getComponent(game).getUserInfo(data.d.user.nickname,data.d.user.avatar)
                        // // 更新当前三个区域的下注数量
                        // if(data.d.game.status==1){
                        //     this.gameNode.getComponent(game).getNowBet(data.d.allBet,data.d.myBet)
                        // }
                        // // 根据所有玩家下注数量实例化筹码
                        // this.gameNode.getComponent(game).getNowCoin(data.d.allBet)
                    }else if(data.t == 2 && data.d.game.status == 100){//游戏状态：结算
                        // // 更新结算面板数据
                        // this.gameNode.getComponent(game).getEndResult(data.d.game.status,data.d.game.roundNum,data.d.myResult.income,data.d.myResult.cost,data.d.game.result)
                        // // 每轮结束更新auto
                        // this.gameNode.getComponent(game).updateAutoData()
                        // // 更新Top1玩家信息
                        // this.gameNode.getComponent(game).getTopMessage(data.d.winnerList,data.t == 1)
                        // // 更新每局前三玩家数组
                        // this.gameNode.getComponent(game).getTopthreeArr(data.d.winnerList)
                        // // 收到结算信息，展示结算界面
                        // this.gameNode.getComponent(game).showEnd(5000,data.d.myResult.income)
                    }else if(data.t == 202){//排行榜查询
                        // if(data.d.code == 1001){
                        //     // 展示重复登录界面
                        //     this.systemFunction.getComponent(systemFunction).openRelogin()
                        // }
                        // if(data.d.code == 0){
                        //     // 更新排行榜列表记录
                        //     this.ranking.getComponent(getRank).updateRankingList(data.d.data.list)
                        // }
                    }else if(data.t == 203){//下注记录查询(历史记录)
                        // if(data.d.code == 1001){
                        //     // 展示重复登录界面
                        //     this.systemFunction.getComponent(systemFunction).openRelogin()
                        // }
                        // if(data.d.code == 0){
                        //     this.history.getComponent(getHistory).getHistory(data.d.data.list)
                        // }
                    }
                };
                fileReader.readAsArrayBuffer(blob); // 异步读取
            }else{
                AllData = JSON.parse(event.data)
                if(AllData.t!= 205){
                    console.log("接受到非Blob信息转为JS",AllData)
                }
            }
            if(AllData.t == 2 && AllData.d.game.status == 1){//游戏状态：玩家可下注
                // // 收到信息开始倒计时
                // this.gameNode.getComponent(game).getBetTime(AllData.d.game.ms,AllData.d.game.status,AllData.d.game.result,AllData.d.game.income)
                // // 更新上一轮前五玩家信息
                // this.gameNode.getComponent(game).getLastWinner()
                // // 改变筹码价值
                // this.gameNode.getComponent(game).changeValue(AllData.t,AllData.d.goldList[0],AllData.d.goldList[1],AllData.d.goldList[2],AllData.d.goldList[3])
            }else if(AllData.t == 2 && AllData.d.game.status == 10){//游戏状态：正常抽奖
                // this.gameNode.getComponent(game).Dragon(AllData.d.game.cards[0])
                // this.gameNode.getComponent(game).Tiger(AllData.d.game.cards[1])
                // this.gameNode.getComponent(game).getRoundResult(AllData.d.game.result,AllData.d.game.status)
                
            }else if(AllData.t == 3){//其他玩家下注
                // console.log(AllData,"有其他玩家下注")
                // let codeMap = AllData.d.codeMap
                // for(var i =0; i<3; i++){
                //     let codeName = Object.keys(codeMap)[i]
                //     if(Object.keys(codeMap)[i]==null)break
                //     this.gameNode.getComponent(game).changeAllGoldLabel(codeName,codeMap[codeName].allGold)
                //     // 根据下注成功后返回的信息播放动画(塞进本次下注车标名字文本和本次下注金额)
                //     this.gameNode.getComponent(game).otherBetAni(codeName,codeMap[codeName].gold)
                // }
                
            }
            else if(AllData.t == 204){//玩家余额变动
                // if(AllData.d.Code == 1001){
                //     // 展示重复登录界面
                //     this.systemFunction.getComponent(systemFunction).openRelogin()
                // }else if(AllData.d.Code == 0){
                //     // console.log(AllData.d.data.balance,"用户余额")
                //     this.gameNode.getComponent(game).updataGold(AllData.d.data.balance)
                // }else if(AllData.d.Code == 1002){//用户余额不足，弹充值弹窗
                //     this.systemFunction.getComponent(systemFunction).openRecharge()
                //     // 未下注成功则隐藏未成功下注数组的筹码
                //     for(var i = 0;i<this.gameNode.getComponent(game).UnBetArr.length;i++){
                //         this.gameNode.getComponent(game).UnBetArr[i].active = false
                //     }
                // }
                
            }else if(AllData.t == 201){// 下注结果
                // if(AllData.d.code == 0){
                //     console.log("用户下注成功")
                //     // 清空未成功下注数组数据
                //     this.gameNode.getComponent(game).UnBetArr = []
                //     let codeMap = AllData.d.data.codeMap
                //     // 此处的i长度代表最多下注数量
                //     for(var i =0; i<3; i++){
                //         let codeName = Object.keys(codeMap)[i]
                //         if(Object.keys(codeMap)[i]==null)break
                //         this.gameNode.getComponent(game).changeBetLabel(codeName,codeMap[codeName].myGold,codeMap[codeName].allGold)
                //     }
                //     // 更新Auto数据
                //     this.gameNode.getComponent(game).getAutoData(AllData.d.data.codeMap)
                // }else if(AllData.d.code == 1000){
                //     // 展示提示弹窗
                //     this.TipNode.active = true
                //     this.TipNode.children[0].getComponent(Label).string = AllData.d.msg
                //     // 未下注成功则隐藏未成功下注数组的筹码
                //     for(var i = 0;i<this.gameNode.getComponent(game).UnBetArr.length;i++){
                //         this.gameNode.getComponent(game).UnBetArr[i].active = false
                //     }
                //     setTimeout(()=>{
                //         this.TipNode.active = false
                //     },3000)
                // }else if(AllData.d.code == 1002){//用户余额不足，弹充值弹窗
                //     this.systemFunction.getComponent(systemFunction).openRecharge()
                //     // 未下注成功则隐藏未成功下注数组的筹码
                //     for(var i = 0;i<this.gameNode.getComponent(game).UnBetArr.length;i++){
                //         this.gameNode.getComponent(game).UnBetArr[i].active = false
                //     }
                // }else if(AllData.d.code == 1001){
                //     // 展示重复登录界面
                //     this.systemFunction.getComponent(systemFunction).openRelogin()
                //     // 未下注成功则隐藏未成功下注数组的筹码
                //     for(var i = 0;i<this.gameNode.getComponent(game).UnBetArr.length;i++){
                //         this.gameNode.getComponent(game).UnBetArr[i].active = false
                //     }
                // }
            }else if(AllData.t == 4){// 展示重复登录界面
                // this.systemFunction.getComponent(systemFunction).openRelogin()
            }else if(AllData.t == 205){
                // console.log(AllData,"网络延迟")
                // 更新网络延迟
                // this.gameNode.getComponent(game).internetTest(AllData.d.ts)
                
            }
        };

        this.ws.onerror = (event) => {
            // clearInterval(this.wifiTimer)
            // console.error('Websocket发生错误', event);
            // this.reconnectTimer = setTimeout(()=>{
            //     // 连接失败等待3秒后弹出连接弹窗
            //     // 不是挂机引起的断连才会拉起wifi界面
            //     if(!this.systemFunction.getComponent(systemFunction).guajiNode.active){
            //         // 展示WiFi界面
            //         this.systemFunction.getComponent(systemFunction).openWifi()
            //     }
            // },3000)
         

        };

        this.ws.onclose = (event) => {
            // clearInterval(this.wifiTimer)
            // console.log('Websocket已关闭', event);
            
            // this.reconnectTimer = setTimeout(()=>{
            //     // 连接失败等待2.5秒后弹出连接弹窗
            //     // 不是挂机引起的断连才会拉起wifi界面
            //     if(!this.systemFunction.getComponent(systemFunction).guajiNode.active){
            //         // 展示WiFi界面
            //         this.systemFunction.getComponent(systemFunction).openWifi()
            //     }
            // },3000)

           
        };
    }

    // 发送消息
    sendMessage(msg: string, t: number) {
        if (this.ws && this.ws.readyState === WebSocket.OPEN) {
            // 客户端向服务器发送信息
            this.ws.send(msg);
            this.ws.send(`${t}`);
            // console.log('发送消息:', msg, "下注数量", BetNums);
        } else {
            console.warn('Websocket未连接，无法发送消息');
        }
    }
    // 发送关于游戏开始、进行以及结束类的信息
    sendGameMessage(t:number, status :number){
        if (this.ws && this.ws.readyState === WebSocket.OPEN) {
            // 客户端向服务器发送信息
            const obj = {
                "t" : t,
                "status" : status
            }
            this.ws.send(JSON.stringify(obj));
            // console.log('发送消息:', msg, "下注数量", BetNums);
        } else {
            console.warn('Websocket未连接，无法发送消息');
        }
    }

    // 用户请求查询下注记录
    getBetRecord(){
        const obj = {
            "t": 103,
            "d": {

            }
          }
        this.ws.send(JSON.stringify(obj));
    }
    // 用户下注发送信息请求
    BetMessage(BetList){
        const obj = {
            "t": 101,
            "d": {
              "chooseList": BetList
            }
          }
        //   console.log(obj,"oooooooooooooooooo")
          this.ws.send(JSON.stringify(obj));
    }
    // 用户请求查询排行榜请求
    getRankingList(){
        const obj = {
            "t": 102,
            "d": {

            }
          }
        this.ws.send(JSON.stringify(obj));
    }
    // 断开连接
    disconnect() {
        if (this.ws) {
            this.ws.close();
            this.ws = null;
        }
    }
    // 重新连接
    reconnect(){
        this.disconnect()
        // 调用连接方法进行重连
        this.connect()
        
        // director.loadScene('game')
    }
    // 可选：脚本销毁时自动断开连接
    onDestroy() {
        
        this.disconnect();
    }
    // 退出按钮功能
    WifiExit(){
        console.log("exit")
        if (window.webkit?.messageHandlers) {
            if (window.webkit.messageHandlers.quit) {
              window.webkit.messageHandlers.quit.post(null);
            } else {
              window.webkit.messageHandlers.destroy.post(null);
            }
          } else if (window.JsBridge?.quit) {
            window.JsBridge.quit();
          } else if (window.NativeBridge?.destroy) {
            window.NativeBridge.destroy("");
          }
    }
    // 检测玩家切入后台
    checkFocus(){
        window.onfocus = function(){
            console.log(1)
            if(this.isFocus == false){
                this.isFocus = true
                console.log("获得焦点")
            }
        }
        window.onblur = function(){
            console.log(2)
            if(this.isFocus){
                this.isFocus = false
                console.log("失去焦点")
            }
            
        }
    }
    // 触发充值
    ClickRecharge() {
        console.log("recharge")
        if (window.webkit?.messageHandlers) {
            if (window.webkit.messageHandlers.recharge) {
              window.webkit.messageHandlers.recharge.post(null);
            } else if (window.webkit.messageHandlers.gameRecharge) {
              window.webkit.messageHandlers.gameRecharge.post(null);
            }
          } else if (window.JsBridge?.recharge) {
            window.JsBridge.recharge();
          } else if (window.NativeBridge?.gameRecharge) {
            window.NativeBridge.gameRecharge("");
          }
    }

    updateWallet(amount: number) {
        console.log(`收到充值成功回调，充值金额: ${amount}`);
        // 向服务器发送刷新用户余额信息
        const obj = {
            "t": 104,
            "d": {
            }
          }
        this.ws.send(JSON.stringify(obj));
    }
}